#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

// 定义全局信号量，控制线程执行顺序
sem_t sem_CA, sem_AD, sem_EF;

// 线程函数声明
void* thread_1(void* arg);
void* thread_2(void* arg);

int main() {
    pthread_t tid_1, tid_2;

    // 初始化信号量：初始值为 0，表示线程需等待触发
    sem_init(&sem_CA, 0, 0);  // A 等待 C 的信号
    sem_init(&sem_AD, 0, 0);  // D 等待 A 的信号
    sem_init(&sem_EF, 0, 0);  // F 等待 E 的信号
    
    // 创建所有线程
    pthread_create(&tid_1, NULL, thread_1, NULL);
    pthread_create(&tid_2, NULL, thread_2, NULL);

    // 等待所有线程结束
    pthread_join(tid_1, NULL);
    pthread_join(tid_2, NULL);

    // 销毁信号量，释放资源
    sem_destroy(&sem_CA);
    sem_destroy(&sem_AD);
    sem_destroy(&sem_EF);

    return 0;
}

void* thread_1(void* arg) {
    printf("线程 T1 的 B 操作执行完毕\n");
    sem_wait(&sem_CA);      // 等待 C 执行完
    printf("线程 T1 的 A 操作执行完毕\n");
    sem_post(&sem_AD);      // A 执行完，给 D 发送信号
    printf("线程 T1 的 E 操作执行完毕\n");
    sem_post(&sem_EF);      // E 执行完，给 F 发送信号
    pthread_exit(NULL);
}

void* thread_2(void* arg) {
    printf("线程 T2 的 C 操作执行完毕\n");
    sem_post(&sem_CA);      // C 执行完，给 A 发送信号
    sem_wait(&sem_AD);      // 等待 A 执行完
    printf("线程 T2 的 D 操作执行完毕\n");
    sem_wait(&sem_EF);      // 等待 E 执行完
    printf("线程 T2 的 F 操作执行完毕\n");
    pthread_exit(NULL);
}